import sys
import pygame
from settings import Settings
from ship import Ship
from bullet import Bullet
from alien import Alien


class AlienInvasion:
    """ 管理游戏资源和行为的类 """

    def __init__(self):
         """ 初始化游戏并创建游戏资源 """
         pygame.init()
         #创建一个时钟（clock），并确保它在主循环每次通过后都进行计时（tick）。当这个循环的通过速度超过我们定义的帧率时，Pygame 会计算需要暂停多长时间，以便游戏的运行速度保持一致。
         self.clock=pygame.time.Clock()
         self.settings=Settings()

         """ 创建一个显示窗口 """
         self.screen=pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
         """ 创建一个显示窗口 """


         """ 全屏 
         self.screen = pygame.display.set_mode((0, 0),pygame.FULLSCREEN)
         self.settings.screen_width =self.screen.get_rect().width
         self.settings.screen_height =self.screen.get_rect().height
          """

         self.ship=Ship(self)
         self.bullets=pygame.sprite.Group()    #创建用于存储子弹的编组
         self.aliens=pygame.sprite.Group()     #创建用于存储外星舰队的编组   
         self._create_fleet() 

         pygame.display.set_caption("Alien Invasion")
         #背景设置为另一种颜色
         self.bg_color=(230,230,230)




    def   run_game(self):
          """ 初开始游戏的主循环 """
               # 它在每次执行 while 循环时都绘制一个空屏幕，并擦去旧屏幕，使得只有新的空屏幕可见。我们在移动游戏元素时，pygame.display.flip() 将不断更新屏幕，以显示新位置上的元素并隐藏原来位置上的元素，从而营造平滑移动的效果           
          while True:
               self._check_events()
               self.ship.update()
               self._update_bullets()
               self._update_screen()
               #让这个时钟进行计时.tick() 方法接受一个参数：游戏的帧率。这里使用的值为 60，Pygame 将尽可能确保这个循环每秒恰好运行 60 次。  
               self.clock.tick(60)

          
    def   _check_events(self):  #检测相关的事件（如按下和释放）
          #侦听键盘和鼠标的事件
          for event in pygame.event.get():
          #当玩家单击游戏窗口的关闭按钮时，将检测到 pygame.QUIT 事件，进而调用 sys.exit() 来退出游戏
           if event.type==pygame.QUIT:
                sys.exit()
           elif event.type==pygame.KEYDOWN:
               self._check_keydown_events(event)
           elif event.type==pygame.KEYUP:
               self._check_keyup_events(event)     




    def  _check_keydown_events(self,event):
          if event.key==pygame.K_RIGHT:
               #self.ship.rect.x+=1
               self.ship.moving_right=True
          elif event.key==pygame.K_LEFT:
               self.ship.moving_left=True
          elif event.key==pygame.K_UP:
               self.ship.moving_up=True
          elif event.key==pygame.K_DOWN:                     
               self.ship.moving_down=True
          elif event.key==pygame.K_q:
                sys.exit()
          elif event.key==pygame.K_SPACE:
                self._fire_bullet()           


    def  _check_keyup_events(self,event):
           if event.key==pygame.K_RIGHT:
                    self.ship.moving_right=False
           elif event.key==pygame.K_LEFT:
                     self.ship.moving_left=False
           elif event.key==pygame.K_UP:
                     self.ship.moving_up=False
           elif event.key==pygame.K_DOWN:                     
                     self.ship.moving_down=False            



    def   _update_screen(self):
          # 每次循环时都重绘屏幕
          self.screen.fill(self.settings.bg_color)  
          self.ship.blitme() 
          #让最近绘制的屏幕可见  
          pygame.display.flip()          
    


    def _fire_bullet(self):
         """创建一颗子弹，并将其加入编组 bullets """
         if len(self.bullets)<self.settings.bullets_allowed:
               new_bullet=Bullet(self)
               self.bullets.add(new_bullet) 


    def _update_screen(self):
          """更新屏幕上的图像，并切换到新屏幕"""
          self.screen.fill(self.settings.bg_color)
          for bullet in  self.bullets.sprites():
                bullet.draw_bullet()

          self.ship.blitme()
          self.aliens.draw(self.screen)           #当对编组调用 draw() 时，Pygame 将把编组中的每个元素绘制到属性 rect 指定的位置上。方法 draw() 接受一个参数，这个参数指定了要将编组中的元素绘制到哪个 surface 上
          pygame.display.flip()      


    def _update_bullets(self):
          self.bullets.update()    #更新子弹的位置
          # 删除已消失的子弹
          for bullet in self.bullets.copy():
               if bullet.rect.bottom<=0:
                    self.bullets.remove(bullet)
               #print(len(self.bullets))          


    def _create_fleet(self):
         """创建一个外星舰队""" 
         # 创建一个外星人
         alien=Alien(self)
         self.aliens.add(alien)



if __name__ =='__main__':
    #创建游戏实例并运行游戏
    ai=AlienInvasion() 
    ai.run_game()          